package main

import (
	"io"
	"log"
	"net"
	"os"
)

func recvFile(conn net.Conn, fileName string) {
	//按照文件名创建新文件
	file, err := os.Create(fileName)
	if err != nil {
		log.Printf("os.Create()函数执行错误，错误为:%v\n", err)
		return
	}
	defer file.Close()

	//从网络中读数据，写入本地文件
	for {
		buf := make([]byte, 4096)
		n, err := conn.Read(buf)

		//写入本地文件，读多少，写多少
		file.Write(buf[:n])
		if err != nil {
			if err == io.EOF {
				log.Printf("接收文件%s\n", fileName)
			} else {
				log.Printf("conn.Read()方法执行出错，错误为:%v\n", err)
			}
			return
		}
	}
}

// RecvFile 服务端接收文件
func RecvFile(conn net.Conn, fileName string) {
	defer conn.Close()

	//回写ok给发送端
	conn.Write([]byte("ok"))

	//获取文件内容
	recvFile(conn, fileName)
}

// SendFile 服务端发送文件，提供下载服务
func SendFile(conn net.Conn, fileName string) {
	defer conn.Close()
	//只读打开文件
	file, err := os.Open(fileName)
	if err != nil {
		log.Printf("os.Open()函数执行出错，错误为:%v\n", err)
		conn.Write([]byte("no such file"))
		return
	}
	defer file.Close()
	//回写ok给发送端
	conn.Write([]byte("ok"))

	buf := make([]byte, 4096)
	for {
		//从本地文件中读数据，写给网络接收端。读多少，写多少
		n, err := file.Read(buf)
		if err != nil {
			if err == io.EOF {
				log.Printf("发送文件完毕\n")
			} else {
				log.Printf("file.Read()方法执行错误,错误为:%v\n", err)
			}
			return
		}
		//写到网络socket中
		_, err = conn.Write(buf[:n])
	}
}
